#property description "Lo Script è basato sui dati che l'indicatore RSI mostra"
#property description "quanto spesso il mercato era in"
#property description "area overbought ed oversold nell'intervallo di tempo specificato."
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input int InpMAPeriod=14; // Periodo media mobile
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Tipo di prezzo
input double InpOversoldValue=30.0; // Livello Oversold (_* SovraVenduto)
input double InpOverboughtValue=70.0; // Livello Overbought (_* SovraComprato)
input datetime InpDateStart=D'2012.01.01 00:00'; // Data di inizio Analisi
input datetime InpDateFinish=D'2013.01.01 00:00'; // Data di Fine Analisi
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
double rsi_buff[]; // array dei valori dell'indicatore
int size=0; // grandezza dell' array
//--- riceve l'handle dell'indicatore RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- fallimento nel ricevere l'handle dell'indicatore
PrintFormat("Indicator handle receiving error. Codice Errore = %d",GetLastError());
return;
}
//--- è in loop, finchè l'indicatore calcola tutti i suoi valori
while(BarsCalculated(rsi_handle)==-1)
{
//--- esce se l'indicatore ha completato forzatamente l'operazione dello script
if(IsStopped())
return;
//--- una pausa per permettere all'indicatore di calcolare tutti i suoi valori
Sleep(10);
}
//--- copia i valori dell'indicatore per un certo periodo di tempo
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dell'indicatore. Codice Errore = %d",GetLastError());
return;
}
//--- riceve la grandezza dell'array
size=ArraySize(rsi_buff);
//--- ordina l'array
ArraySort(rsi_buff);
//--- trova l'orario (in termini percetuali) in cui il mercato era in area Oversold
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- trova l'orario (in termini percetuali) in cui il mercato era in area Overbought
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- forma la stringa per visualizzare i dati
string str="From "+TimeToString(InpDateStart,TIME_DATE)+" to "
+TimeToString(InpDateFinish,TIME_DATE)+" il mercato era:";
string str_ovb="in area overbought per il "+DoubleToString(ovb,2)+"% del tempo";
string str_ovs="in area oversold per il "+DoubleToString(ovs,2)+"% del tempo";
//--- mostra i dati sul chart
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- redisegna il chart
ChartRedraw(0);
//--- pausa
Sleep(10000);
}
//+--------------------------------------------------------------------------------+
//| Mostra i commenti sull' angolo sinistro superiore del chart |
//+--------------------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- crea l'etichetta
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- associa l'etichetta verso l'angolo in basso a sinistra
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- cambia la posizione del punto di ancoraggio
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distanza dal punto di ancoraggio in direzione-X
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distanza dal punto di ancoraggio in direzione-Y
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- testo dell'etichetta
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- colore del testo
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- grandezza del testo
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}
|